#include <iostream>
#include <string>
#include <errno.h>
#include <cstring>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

static void Usage(const char *str)
{
    std::cout << "\n Usage ./" << str << " ip port\n"
              << std::endl;
}

// ./TCP_client ip port
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        Usage(argv[0]);
        exit(1);
    }

    // send 和 recv
    char buffer[1024];
    std::string line;
    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    socklen_t len = sizeof(serveraddr);
    while (true)
    {
        // socket
        int sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock < 0)
        {
            printf("socket creat error:%d-%s\n", errno, strerror(errno));
            exit(2);
        }

        // 不需要显示的bind， 需要connect
        if (connect(sock, (struct sockaddr *)&serveraddr, len) < 0)
        {
            printf("connect server error:%d-%s\n", errno, strerror(errno));
            exit(3);
        }
        printf("连接到：[ %s | %d ]\n", argv[1], atoi(argv[2]));
        // 输出提示，获取输入内容
        std::cout << "请输入：" << std::endl;
        std::getline(std::cin, line);
        if (line == "quit")
        {
            close(sock);
            break;
        }

        // 发送
        ssize_t sz = send(sock, line.c_str(), line.size(), 0);
        if (sz < 0)
        {
            std::cout << "服务器关闭了" << std::endl;
            close(sock);
            break;
        }
        else if (sz == 0)
        {
            continue;
        }
        // 接收
        sz = recv(sock, buffer, sizeof(buffer), 0);
        if (sz <= 0)
        {
            std::cout << "服务器关闭了" << std::endl;
            close(sock);
            break;
        }
        buffer[sz] = 0;
        std::cout << buffer << std::endl;
        close(sock);
    }

    return 0;
}

// // ./TCP_client ip port
// int main(int argc, char* argv[])
// {
//     if(argc != 3)
//     {
//         Usage(argv[0]);
//         exit(1);
//     }
//     // socket
//     int sock = socket(AF_INET, SOCK_STREAM, 0);
//     if(sock < 0)
//     {
//         printf("socket creat error:%d-%s\n", errno, strerror(errno));
//         exit(2);
//     }

//     // 不需要显示的bind， 需要connect
//     struct sockaddr_in serveraddr;
//     memset(&serveraddr, 0, sizeof(serveraddr));
//     serveraddr.sin_family = AF_INET;
//     serveraddr.sin_port = htons(atoi(argv[2]));
//     serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
//     socklen_t len = sizeof(serveraddr);

//     if(connect(sock, (struct sockaddr*)&serveraddr, len) < 0)
//     {
//         printf("connect server error:%d-%s\n", errno, strerror(errno));
//         exit(3);
//     }

//     printf("连接到：[ %s | %d ]\n", argv[1], atoi(argv[2]));

//     // send 和 recv
//     char buffer[1024];
//     std::string line;
//     while(true)
//     {
//         // 输出提示，获取输入内容
//         std::cout << "请输入：" << std::endl;
//         std::getline(std::cin, line);
//         if(line == "quit") break;
//         // 发送
//         ssize_t sz = send(sock, line.c_str(), line.size(), 0);
//         if(sz < 0)
//         {
//             std::cout << "服务器关闭了" << std::endl;
//             break;
//         }
//         else if(sz == 0)
//         {
//             continue;
//         }
//         // 接收
//         sz = recv(sock, buffer, sizeof(buffer), 0);
//         if(sz <= 0)
//         {
//             std::cout << "服务器关闭了" << std::endl;
//             break;
//         }
//         buffer[sz] = 0;
//         std::cout << buffer << std::endl;

//     }
//     close(sock);

//     return 0;
// }